package ru.st.selenium.pages;


import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;

import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated;

public class UsersAndDepartmentPage extends AnyPage {

	public UsersAndDepartmentPage(PageManager pages) {
		super(pages);
	}
	
	//---------------------------------------------------Фрейм - ПОДРАЗДЕЛЕНИЯ---------------------------------------------------------
	// Выбрать корневое подразделение
	@FindBy(xpath = "//div[@class='x-grid-cell-inner x-grid-cell-inner-treecolumn']")
	private WebElement rootDep;
	
	// Добавить подразделение
	@FindBy(xpath = "//div[contains(@id,'panel-')]//a[1]")
	private WebElement buttonAddDep;
	
	// Редактировать подразделение
	@FindBy(xpath = "//div[contains(@id,'panel-')]//a[3]")
	private WebElement buttonEditDep;
	
	// Удаление подразделения
	@FindBy(xpath = "//div[contains(@id,'panel-')]//a[2]")
	private WebElement buttonRemoveDep;
	

	// Наименование подразделения
	@FindBy(id = "dep_name-inputEl")
	private WebElement nameDep;
	
	// Условный номер
	@FindBy(id = "add_number-inputEl")
	private WebElement conditionalNumber;
	
	// Значение счетчика
	@FindBy(id = "counter-inputEl")
	private WebElement counter;
	
	// Шаблон нумератора
	@FindBy(id = "reset_date-inputEl")
	private WebElement resetDate;
	
	// Дата обнуления
	@FindBy(id = "numerator_template-inputEl")
	private WebElement numeratorTemplate;
	
	// Сохранить подразделение
	@FindBy(xpath = "//span[contains(@id,'-btnIconEl')] [ancestor::div[@id='editDepWin']]")
	private WebElement SaveDep;
	
	// Выбрать дочернее подразделение для Редактирования
	@FindBy(xpath = "//span[contains(text(),'SПодразделение3 (тест)')] [ancestor::tbody[contains(@id,'treeview')]]")
	private WebElement subDep;

	// Выбрать подразделение - SПодразделение2 для Удаления
	@FindBy(xpath = "//span[contains(text(),'SПодразделение2 (тест)')] [ancestor::tbody[contains(@id,'treeview')]]")
	private WebElement subDep2;
	
	// Выбрать подразделение - SПодразделение3_1 для Удаления
	@FindBy(xpath = "//span[contains(text(),'SПодразделение3_1 (тест)')] [ancestor::tbody[contains(@id,'treeview')]]")
	private WebElement subDep3;
	
	// Выбрать подразделение - SПодразделение4 для Добавления пользователя
	@FindBy(xpath = "//span[contains(text(),'SПодразделение4')] [ancestor::tbody[contains(@id,'treeview')]]")
	private WebElement subDep4;
	
	// Выбрать подразделение - SПодразделение1 для Добавления пользователя
	@FindBy(xpath = "//span[contains(text(),'SПодразделение1')] [ancestor::tbody[contains(@id,'treeview')]]")
	private WebElement subDep5;
	
	@FindBy(xpath = "//span[contains(@id,'-btnWrap')]//span[text()='Да']/../span[contains(@id,'-btnIconEl')]")
	private WebElement okRemoveDel;	
	
			
	@FindBy(id = "flow")
	private WebElement Frem;
	
	
	
	
	// Уходим во фрейм
	public UsersAndDepartmentPage gotoFremObjectPage() {
		driver.switchTo().frame(Frem);
		return this;
	}
	
	// Уходим из фрейм опять в ТОР
	public UsersAndDepartmentPage gotoTopFrem() {
		driver.switchTo().defaultContent();
		return this;
	}

	// Выбрать корневое Подразделение
	public UsersAndDepartmentPage clickRootDep() {
		rootDep.click();
		return this;
	}
	
	// Выбрать дочернее Подразделение
	public UsersAndDepartmentPage clickSubDep() {
		subDep.click();
		return this;
	}
	
	
	// Добавить Подразделение
	public UsersAndDepartmentPage ButtonAddDep() {
		buttonAddDep.click();
		return this;
	}

	// Удаление Подразделения
	public UsersAndDepartmentPage clickButtonRemoveDep() {
		buttonRemoveDep.click();
		return this;
	}

	// Редактировать Подразделение
	public UsersAndDepartmentPage clickbuttonEditDep() {
		buttonEditDep.click();
		return this;
	}

	// Название Подразделения
	public UsersAndDepartmentPage setNameDep(String text) {
		nameDep.clear();
		nameDep.sendKeys(text);
		return this;
	}
	
	// Условный номер подразделения
	public UsersAndDepartmentPage setConditionalNumber(String text) {
		conditionalNumber.clear();
		conditionalNumber.sendKeys(text);
		return this;
	}

	// Значение счетчика подразделения
	public UsersAndDepartmentPage setCounter(String text) {
		counter.clear();
		counter.sendKeys(text);
		return this;
	}
	
	// Дата обнуления счетчика подразделения
	public UsersAndDepartmentPage setResetDate(String text) {
		resetDate.clear();
		resetDate.sendKeys(text);
		return this;
	}
	
	// Дата обнуления счетчика подразделения
	public UsersAndDepartmentPage setNumeratorTemplate(String text) {
		numeratorTemplate.clear();
		numeratorTemplate.sendKeys(text);
		return this;
	}
	
	// Сохранение подразделения
	public UsersAndDepartmentPage clickSaveDep() {
		SaveDep.click();
		return this;
	}
	

	// Проверка отображения созданных подразделений:
	// -Подразделение 1
	public UsersAndDepartmentPage verifyCreateDep() {
		waitForPageUntilElementIsVisible(
				By.xpath("//span[contains(text(),'SПодразделение1 (тест)')] [ancestor::tbody[contains(@id,'treeview')]]"),
				5000);
		return this;
	}

	// -Подразделение 2
	public UsersAndDepartmentPage verifyCreateDep1() {
		waitForPageUntilElementIsVisible(
				By.xpath("//span[contains(text(),'SПодразделение2 (тест)')] [ancestor::tbody[contains(@id,'treeview')]]"),
				5000);
		return this;
	}

	// -Подразделение 3
	public UsersAndDepartmentPage verifyCreateDep2() {
		waitForPageUntilElementIsVisible(
				By.xpath("//span[contains(text(),'SПодразделение3 (тест)')] [ancestor::tbody[contains(@id,'treeview')]]"),
				5000);
		return this;
	}

	// -Подразделение 3_1
	public UsersAndDepartmentPage verifyCreateDep2_1() {
		waitForPageUntilElementIsVisible(
				By.xpath("//span[contains(text(),'SПодразделение3_1 (тест)')] [ancestor::tbody[contains(@id,'treeview')]]"),
				5000);
		return this;
	}

	// -Подразделение 4
	public UsersAndDepartmentPage verifyCreateDep3() {
		waitForPageUntilElementIsVisible(
				By.xpath("//span[contains(text(),'SПодразделение4')] [ancestor::tbody[contains(@id,'treeview')]]"),
				5000);
		return this;
	}
	
	
	// Выбираем подразделение - SПодразделение2
	public UsersAndDepartmentPage clickSubDep2() {
		subDep2.click();
		return this;
	}
	
	// Выбираем подразделение - SПодразделение3_1 (тест)
	public UsersAndDepartmentPage clickSubDep3() {
		waitTime(1);
		subDep3.click();
		return this;
	}

	
	// Подтверждение удаления
	public UsersAndDepartmentPage clickOkRemoveDel() {
		wait.until(presenceOfElementLocated(By
				.xpath("//span[contains(@id,'-btnWrap')]//span[text()='Да']/../span[contains(@id,'-btnIconEl')]")));
		okRemoveDel.click();
		return this;
	}
	

	//---------------------------------------------------Фрейм - ПОЛЬЗОВАТЕЛИ---------------------------------------------------------

	@FindBy(xpath = "//a[@id='button-1012']")
	private WebElement buttonAddUser;
	
	// Клик раскрытия дерева подразделений, для выбора подразделения при создании пользователя
	@FindBy(xpath = "//img[contains(@class,'x-tree-elbow-img')]")
	private WebElement subSite;
	
	@FindBy(xpath = "//tr/td[2]/input")
	private WebElement lastNameField;
	
	@FindBy(xpath = "//tr/td[3]/input")
	private WebElement nameField;
	
	@FindBy(xpath = "//tr/td[4]/input")
	private WebElement patronymicField;
	
	// Пол
	@FindBy(xpath = "//input[@type='radio' and @name='sex']/.. /../div[2]/input")
	private WebElement clickRadioButtonSex;
	
	@FindBy(xpath = "//iframe[contains(@id,'component-')]")
	private WebElement FremEditUser;
	
	// Дата рождения
	@FindBy(xpath = "//img[contains(@class,'x-form-trigger x-form-date-trigger')]")
	private WebElement clickDate;
	
	@FindBy(xpath = "//table[@class='x-date-inner']/tbody/tr[1]//span")
	private WebElement setDate;
	
	// Должность
	@FindBy(xpath = "//tbody/tr//label[text()='Должность:']/.. /input")
	private WebElement jobTitle;
	
	// Фото
	@FindBy(xpath = "//input[@class='photo-uploader' or @type='file']")
	private WebElement selectFoto;
		
	
	// Имя пользователя (login)
	@FindBy(xpath = "//div[text()='Имя пользователя']/parent::td/following-sibling::td[1]/div")
	private WebElement clickNameUserLogin;
	
	@FindBy(xpath = "//div[text()='Имя пользователя']/parent::td/parent::tr/parent::tbody/parent::table/parent::div/parent::div/following-sibling::div/input")
	private WebElement setNameUserLogin;
	
	// Пароль
	@FindBy(xpath = "//div[text()='Пароль']/parent::td/following-sibling::td[1]/div")
	private WebElement clickFieldPassword;
	
	@FindBy(xpath = "//input[@type='password']")
	private WebElement setPassword;
	
	// Подтверждение пароля
	@FindBy(xpath = "//div[text()='Подтверждение пароля']/parent::td/following-sibling::td[1]/div")
	private WebElement clickСonfirmationPassword;

	@FindBy(id = "ext-comp-1039")
	private WebElement setСonfirmationPass;

	// Дополнительный номер
	@FindBy(xpath = "//div[contains(@id,'ext-')]/div[6]//td[2]")
	private WebElement clickAdditionalNumber;
	
	@FindBy(xpath = "//input[@id='ext-comp-1027' and @type='text']")
	private WebElement setAdditionalNum;
	
	// Порядок пользователя при принудительной сортировке
	@FindBy(xpath= "//div[contains(@id,'ext-')]/div[7]//td[2]")
	private WebElement clickUserForcedSorting;
	
	@FindBy(id = "ext-comp-1029")
	private WebElement setUserForcedSorting;
	
	// Сменить пароль при следующем входе
	@FindBy(id = "needpasswordchange_-1")
	private WebElement clickNeedPasswordChange;
	
	// Страна
	@FindBy(xpath = "//div[contains(@id,'ext-')]/div[11]//td[2]")
	private WebElement clickСountry;
	
	
	@FindBy(xpath = "//div[2]/div[2]/input")
	private WebElement setValueAttributesUsers;
	
	@FindBy(xpath = "//*[@id='ext-comp-1041']")
	private WebElement setValueAttributes2Users;
	
	@FindBy(xpath = "//*[@id='ext-comp-1043']")
	private WebElement setValueAttributes3Users;
	
	@FindBy(xpath = "//div[@id='ext-comp-1028']/input")
	private WebElement setValueAttributes4Users;

	
	// Почтовый код
	@FindBy(xpath = "//div[contains(@id,'ext-')]/div[12]//td[2]")
	private WebElement clickPostalCode;
	
	// Область
	@FindBy(xpath = "//div[contains(@id,'ext-')]/div[13]//td[2]")
	private WebElement clickRegion;
		
	// Адрес
	@FindBy(xpath = "//div[contains(@id,'ext-')]/div[15]//td[2]")
	private WebElement clickAddress;
	
	// Рабочий телефон
	@FindBy(xpath = "//div[contains(@id,'ext-')]/div[17]//td[2]")
	private WebElement clickJobIphone;
	
	// Домашний телефон
	@FindBy(xpath = "//div[contains(@id,'ext-')]/div[18]//td[2]")
	private WebElement clickHomeIphone;

	// email
	@FindBy(xpath = "//div[contains(@id,'ext-')]/div[20]//td[2]")
	private WebElement clickEmail;
	
	// Компания
	@FindBy(xpath = "//div[contains(@id,'ext-')]/div[26]//td[2]")
	private WebElement clickCompany;
	
	// Сохранить пользователя
	@FindBy(xpath = "//button[text()='Сохранить']")
	private WebElement clickButtonSave;
	
	
	
	
	public UsersAndDepartmentPage fremEditUser() {
		driver.switchTo().frame(FremEditUser);
		return this;
	}

	public UsersAndDepartmentPage buttonAddUser() {
		buttonAddUser.click();
		return this;
	}
	
	// Раскрытие дочернего подразделения - выбор дочернего подразделения для создания пользователя
	public UsersAndDepartmentPage clickSubSite() {
		subSite.click();
		wait.until(presenceOfElementLocated(By
				.xpath("//span[contains(text(),'SПодразделение1 (тест)')] [ancestor::tbody[contains(@id,'treeview')]]")));
		subDep4.click();
		return this;
	}
	
	// Выбор 2-го подразделения для создания пользователя
	public UsersAndDepartmentPage clickSubSite2() {
		subDep5.click();
		return this;
	}
	
	
	
	
	
	
	// Фамилия
	public UsersAndDepartmentPage setLastNameField(String text) {
		lastNameField.click();
		lastNameField.clear();
		lastNameField.sendKeys(text);
		return this;
	}
	
	// Имя
	public UsersAndDepartmentPage setNameField(String text) {
		nameField.click();
		nameField.clear();
		nameField.sendKeys(text);
		return this;
	}

	// Отчество
	public UsersAndDepartmentPage clickSexWomen() {
		clickRadioButtonSex.click();
		return this;
	}

	// SEX
	public UsersAndDepartmentPage setPatronymicField(String text) {
		patronymicField.click();
		patronymicField.clear();
		patronymicField.sendKeys(text);
		return this;
	}

	// Дата рождения
	public UsersAndDepartmentPage selectDateOfBirth(){
		clickDate.click();
		setDate.click();
		return this;
	}
	
	// Должность
	public UsersAndDepartmentPage setJobTitle(String text) {
		jobTitle.click();
		jobTitle.clear();
		jobTitle.sendKeys(text);
		return this;
	}
	
	// Имя пользователя (login)
	public UsersAndDepartmentPage setNameUserLogin(String text) {
		clickNameUserLogin.click();
		setNameUserLogin.clear();
		setNameUserLogin.sendKeys(text);
		return this;
	}

	// Пароль
	public UsersAndDepartmentPage setPasswordUser(String text) {
		clickFieldPassword.click();
		setPassword.clear();
		setPassword.sendKeys(text);
		return this;
	}
	
	// Подтверждение пароля
	public UsersAndDepartmentPage setСonfirmationPassword(String text) {
		clickAdditionalNumber.click();
		clickСonfirmationPassword.click();
		setСonfirmationPass.clear();
		setСonfirmationPass.sendKeys(text);
		return this;
	}
	
	// Дополнительный номер
	public UsersAndDepartmentPage setAdditionalNumber(String text) {
		clickAdditionalNumber.click();
		setAdditionalNum.clear();
		setAdditionalNum.sendKeys(text);
		return this;
	}
	
	// Порядок пользователя при принудительной сортировке
	public UsersAndDepartmentPage setUserForcedSorting(String text) {
		clickUserForcedSorting.click();
		setUserForcedSorting.clear();
		setUserForcedSorting.sendKeys(text);
		return this;
	}

	// Сменить пароль при следующем входе
	public UsersAndDepartmentPage clickNeedPasswordChange() {
		clickNeedPasswordChange.click();
		return this;
	}
	
	// Страна
	public UsersAndDepartmentPage setCountry(String text) {
		clickСountry.click();
		setValueAttributesUsers.clear();
		setValueAttributesUsers.sendKeys(text);
		return this;
	}

	// Почтовый код
	public UsersAndDepartmentPage setPostalCode(String text) {
		clickPostalCode.click();
		setValueAttributesUsers.clear();
		setValueAttributesUsers.sendKeys(text);
		return this;
	}
	
	// Область
	public UsersAndDepartmentPage setRegion(String text) {
		clickRegion.click();
		setValueAttributesUsers.clear();
		setValueAttributesUsers.sendKeys(text);
		return this;
	}
	
	// Адрес - улица, дом, кв.
	public UsersAndDepartmentPage setAddress(String text) {
		clickAddress.click();
		setValueAttributesUsers.clear();
		setValueAttributesUsers.sendKeys(text);
		return this;
	}

	// Рабочий телефон
	public UsersAndDepartmentPage setJobIphone(String text) {
		clickJobIphone.click();
		setValueAttributes2Users.clear();
		setValueAttributes2Users.sendKeys(text);
		return this;
	}

	// Домашний телефон
	public UsersAndDepartmentPage setHomeIphone(String text) {
		clickHomeIphone.click();
		setValueAttributes2Users.clear();
		setValueAttributes2Users.sendKeys(text);
		return this;
	}
	
	// email
	public UsersAndDepartmentPage setEmail(String text) {
		clickEmail.click();
		setValueAttributes3Users.clear();
		setValueAttributes3Users.sendKeys(text);
		return this;
	}
	
	// Компания
	public UsersAndDepartmentPage setCompany(String text) {
		clickCompany.click();
		setValueAttributes4Users.clear();
		setValueAttributes4Users.sendKeys(text);
		return this;
	}
	
	// Сохранение пользователя
	public UsersAndDepartmentPage clickButtonSave() {
		clickButtonSave.click();
		return this;
	}

	// Проверка создания пользователей:
	// -Пользователь1
	public UsersAndDepartmentPage verifyCreateUser() {
		wait.until(presenceOfElementLocated(By
				.xpath("//tbody[contains(@id,'gridview')]/tr//a[text()='Спирова Виктория Николаевна']")));
		return this;
	}
	// -Пользователь2
	public UsersAndDepartmentPage verifyCreateUser2() {
		wait.until(presenceOfElementLocated(By
				.xpath("//tbody[contains(@id,'gridview')]/tr//a[text()='Маршак Геннадий Александрович']")));
		return this;
	}
	
	// -Пользователь3
	public UsersAndDepartmentPage verifyCreateUser3() {
		wait.until(presenceOfElementLocated(By
				.xpath("//tbody[contains(@id,'gridview')]/tr//a[text()='Иванов Иван Иванович']")));
		return this;
	}
	
	
	// Проверяем и ожидаем, что на странице имеется соответствующий элемент
	public UsersAndDepartmentPage ensurePageLoaded() {
		super.ensurePageLoaded();
		wait.until(presenceOfElementLocated(By
				.xpath("//div[@class='x-grid-cell-inner x-grid-cell-inner-treecolumn']")));
		wait.until(presenceOfElementLocated(By
				.xpath("//div[contains(@id,'panel-')]//a[1]")));
		return this;
	}
	


	

	
	
}